
namespace xyx
{
    template<class Iterator, class Ref, class Ptr>
    struct RerverseIterator
    {
        typedef RerverseIterator<Iterator, Ref, Ptr> self;
        Iterator _it;

        RerverseIterator(Iterator it)
        :_it(it)
        {}

        Ref operator*()
        {
            Iterator tmp = _it;
            return *(--tmp);
        }

        self& operator++()
        {
            --_it;
            return *this;
        }

        self& operator--()
        {
            ++_it;
            return *this;
        }


        Ptr operator->()
        {
            return &(operator*());
        }

        bool operator!=(const self& s) const
        {
            return _it != s._it;
        }
        
    };
    
} 
